const express = require("express");
const { PrismaClient } = require("@prisma/client");
const cors = require("cors");
const prisma = new PrismaClient();
const { expressjwt: jwt } = require("express-jwt");
const { jwtSecret } = require("./config");
const bodyParser = require("body-parser");
// 引入并初始化WebSocket模块
const initWebSocket = require("./src/routers/ws/ws");
const app = express();
const path = require("path");

// 引入 Winston 日志记录器
const logger = require("./src/logger/index");

logger.info("my-app", "Server is running on http://localhost:3000");
logger.error("security", "Unauthorized access attempt");
// 白名单路由数组
const publicRoutes = [
  "/api/users/login",
  "/api/users/register",
  "/api/users/",
  "/api/logs",
];

// JWT 鉴权中间件
const authenticateJWT = jwt({
  secret: jwtSecret,
  algorithms: ["HS256"],
  requestProperty: "auth", // 将payload附加到request.auth对象上
}).unless({
  path: publicRoutes,
});

// 解析 application/x-www-form-urlencoded 类型的请求体
app.use(bodyParser.urlencoded({ extended: true }));

// 解析 application/json 类型的请求体
app.use(bodyParser.json());
app.use(authenticateJWT);
const userRoutes = require("./src/routers/users/index");
const PORT = process.env.PORT || 3000;

app.use(express.json());
app.use(cors());
// 错误处理中间件
app.use((err, req, res, next) => {
  if (err.name === "UnauthorizedError") {
    return res.status(401).json({ error: "无权限，请登录" });
  }
  next(err);
});
// 在 index.js 中添加以下代码
// 在 index.js 中添加以下代码
const fs = require("fs");

app.get("/api/logs", async (req, res) => {
  try {
    // 日志文件路径
    const logFilePath = path.join(__dirname, "error.log"); // 或者 'combined.log'

    // 读取文件内容
    const logData = await fs.promises.readFile(logFilePath, "utf8");

    // 返回日志内容
    res.json({ logs: logData.split("\n") });
  } catch (error) {
    console.error("读取日志文件时发生错误:", error);
    res.status(500).json({ error: "服务器内部错误" });
  }
});
// // 示例路由：获取所有用户
// app.get("/users", async (req, res) => {
//     const users = await prisma.user.findMany();
//     res.json(users);
// });

// // 注册新用户
// app.post("/users/register", async (req, res) => {
//     console.log("Received request to register a new user", JSON.stringify(req.body));
//     try {
//         const { name, email, password } = req.body;

//         // 验证请求数据
//         if (!name || !email || !password) {
//             return res.status(400).json({ error: "缺少必要字段" });
//         }

//         // 检查邮箱是否已存在
//         const existingUser = await prisma.user.findUnique({
//             where: { email },
//         });
//         if (existingUser) {
//             return res.status(409).json({ error: "邮箱已存在" });
//         }

//         // 创建新用户
//         const newUser = await prisma.user.create({
//             data: {
//                 name,
//                 email,
//                 password,
//             },
//         });

//         res.status(201).json(newUser);
//     } catch (error) {
//         console.error("注册新用户时发生错误:", error);
//         res.status(500).json({ error: "服务器内部错误" });
//     }
// });

// // 用户登录
// app.post("/users/login", async (req, res) => {
//     try {
//         const { email, password } = req.body;

//         // 验证请求数据
//         if (!email || !password) {
//             return res.status(400).json({ error: "缺少必要字段" });
//         }

//         // 查找用户
//         const user = await prisma.user.findUnique({
//             where: { email },
//         });

//         if (!user || user.password !== password) {
//             return res.status(401).json({ error: "邮箱或密码错误" });
//         }

//         res.json({ message: "登录成功", user });
//     } catch (error) {
//         console.error("用户登录时发生错误:", error);
//         res.status(500).json({ error: "服务器内部错误" });
//     }
// });

// // 删除用户
// app.delete("/users/:id", async (req, res) => {
//     try {
//         const userId = parseInt(req.params.id);

//         // 验证用户ID
//         if (isNaN(userId)) {
//             return res.status(400).json({ error: "无效的用户ID" });
//         }

//         // 删除用户
//         const deletedUser = await prisma.user.delete({
//             where: { id: userId },
//         });

//         res.json({ message: "用户删除成功", user: deletedUser });
//     } catch (error) {
//         console.error("删除用户时发生错误:", error);
//         res.status(500).json({ error: "服务器内部错误" });
//     }
// });

// // 修改用户信息
// app.put("/users/:id", async (req, res) => {
//     try {
//         const userId = parseInt(req.params.id);
//         const { name, email, password } = req.body;

//         // 验证用户ID
//         if (isNaN(userId)) {
//             return res.status(400).json({ error: "无效的用户ID" });
//         }

//         // 更新用户信息
//         const updatedUser = await prisma.user.update({
//             where: { id: userId },
//             data: {
//                 name,
//                 email,
//                 password,
//             },
//         });

//         res.json({ message: "用户信息更新成功", user: updatedUser });
//     } catch (error) {
//         console.error("修改用户信息时发生错误:", error);
//         res.status(500).json({ error: "服务器内部错误" });
//     }
// });
app.use("/api/users", userRoutes);

const server = app.listen(PORT, () => {
  console.log(`Server is running on http://localhost:${PORT}`);
  logger.info("APP_MAIN", `Server is running on http://localhost:${PORT}`);
});

initWebSocket(server, authenticateJWT);

// 在程序退出时清理
process.on("SIGINT", async () => {
  await prisma.$disconnect();
  process.exit(0);
});
